// ==UserScript== // @name 翻译 // @namespace http://aigent.vip/ // @version 1.0 // @description 翻译按钮添加拖拽功能(不影响单击,拖拽时禁止页面滚动) // @author 运营小住手 // @match *://*/* // @grant none // @run-at document-end // ==/UserScript== (function () { 'use strict'; // 动态加载 translate.js 脚本 const script = document.createElement('script'); script.src = 'https://cdn.staticfile.net/translate.js/3.12.0/translate.js'; script.onload = () => { console.log('translate.js 加载成功'); initializeTranslation(); // 加载成功后初始化翻译功能 }; script.onerror = () => { console.error('translate.js 加载失败'); }; document.head.appendChild(script); // 初始化翻译功能 function initializeTranslation() { translate.language.setLocal('chinese_simplified'); // 设置本地语种 translate.service.use('client.edge'); // 设置翻译通道 translate.execute(); // 执行翻译功能 // 等待翻译按钮加载并添加拖拽功能 waitForTranslateButton((button) => { button.style.position = 'fixed'; // 设置为固定定位 button.style.zIndex = '10000'; // 确保在最上层 button.style.width = '100px'; // 设置按钮宽度 button.style.top = '100px'; // 初始位置 button.style.right = '100px'; // 初始位置 button.style.cursor = 'move'; // 鼠标悬停显示拖拽样式 makeDraggable(button); // 为按钮添加拖拽功能 }); } // 等待翻译按钮加载 function waitForTranslateButton(callback) { const interval = setInterval(() => { const button = document.querySelector('.translateSelectLanguage'); if (button) { clearInterval(interval); // 停止轮询 callback(button); } }, 100); // 每 100ms 检查一次 } // 实现拖拽功能 function makeDraggable(element) { let isDragging = false; // 是否正在拖拽 let startX, startY, offsetX, offsetY; const DRAG_THRESHOLD = 10; // 拖拽阈值 // 禁止页面滚动(适用于 PC 和手机) function disablePageScroll() { document.addEventListener('wheel', preventDefault, { passive: false }); // 禁止滚轮事件 document.addEventListener('touchmove', preventDefault, { passive: false }); // 禁止触摸滚动 } // 恢复页面滚动 function enablePageScroll() { document.removeEventListener('wheel', preventDefault); document.removeEventListener('touchmove', preventDefault); } // 阻止默认事件的函数 function preventDefault(e) { e.preventDefault(); } element.addEventListener('mousedown', (e) => { isDragging = false; // 初始化为未拖拽 startX = e.clientX; startY = e.clientY; offsetX = element.offsetLeft; offsetY = element.offsetTop; const mouseMoveHandler = (e) => { const dx = e.clientX - startX; const dy = e.clientY - startY; if (Math.abs(dx) > DRAG_THRESHOLD || Math.abs(dy) > DRAG_THRESHOLD) { if (!isDragging) { isDragging = true; // 标记为拖拽状态 disablePageScroll(); // 禁止页面滚动 } element.style.left = `${offsetX + dx}px`; element.style.top = `${offsetY + dy}px`; } }; const mouseUpHandler = () => { document.removeEventListener('mousemove', mouseMoveHandler); document.removeEventListener('mouseup', mouseUpHandler); if (isDragging) { enablePageScroll(); // 恢复页面滚动 } }; document.addEventListener('mousemove', mouseMoveHandler); document.addEventListener('mouseup', mouseUpHandler); }); // 支持触摸事件 element.addEventListener('touchstart', (e) => { if (e.touches.length !== 1) return; // 仅支持单点触摸 isDragging = false; // 初始化为未拖拽 const touch = e.touches[0]; startX = touch.clientX; startY = touch.clientY; offsetX = element.offsetLeft; offsetY = element.offsetTop; const touchMoveHandler = (e) => { const touch = e.touches[0]; const dx = touch.clientX - startX; const dy = touch.clientY - startY; if (Math.abs(dx) > DRAG_THRESHOLD || Math.abs(dy) > DRAG_THRESHOLD) { if (!isDragging) { isDragging = true; // 标记为拖拽状态 disablePageScroll(); // 禁止页面滚动 } element.style.left = `${offsetX + dx}px`; element.style.top = `${offsetY + dy}px`; } }; const touchEndHandler = () => { document.removeEventListener('touchmove', touchMoveHandler); document.removeEventListener('touchend', touchEndHandler); if (isDragging) { enablePageScroll(); // 恢复页面滚动 } }; document.addEventListener('touchmove', touchMoveHandler); document.addEventListener('touchend', touchEndHandler); }); } })();